package com.it.d2_polymorphism;

public class Test {
    public static void main(String[] args) {

        // 目标： 理解多态的好处

        // 好处1：可以实现解耦合，右边对象可以随时切换，后续业务随之改变
        People p1 = new Student();

        p1.run();

//        p1.test(); // 报错 多态下存在的问题：无法直接调用子类的独有功能

        // 强制类型转换
        Student s1 = (Student) p1;
        s1.test();

        // 强制类型转换可能存在的问题：编译阶段有继续或者实现关系就可以强制转换，但是运行时可能出现类型转换异常
        // Teacher t1 = (Teacher) p1; // 运行时出现异常：ClassCastException（类型转换异常）

        // 使用 instanceof关键字，判断当前对象的真实类型，再进行强转
        // 判断 p1 是否是学生类型
        if (p1 instanceof Student) {
            Student s2 = (Student) p1;
            s2.test();
        } else if(p1 instanceof Teacher) {
            // p1 是老师类型
            Teacher t2 = (Teacher) p1;
            t2.tech();
        }

        // 好处2： 可以使用父类类型的变量作为形参，可以接收一切子类对象
        Student s = new Student();
        go(s);

        Teacher t = new Teacher();
        go(t);
    }

    // 好处2： 可以使用父类类型的变量作为形参，可以接收一切子类对象
    public static void go(People p) {

        // 通用功能
        p.run();

        // 判断 p1 是否是学生类型
        if (p instanceof Student) {
            Student s = (Student) p;
            s.test();
        } else if(p instanceof Teacher) {
            // p1 是老师类型
            Teacher t = (Teacher) p;
            t.tech();
        }

    }
}
